iT邦幫忙

2021 iThome 鐵人賽

DAY 15
0
Security

打通任督二脈奇幻之旅 - 用 30 天探索 Windows 底層運作原理系列 第 15

【Day 15】- 今天來實作一個 Kernel mode Thread

  • 分享至 

  • xImage
  •  

Agenda

  • 資安宣言
  • 測試環境與工具
  • 技術原理與程式碼
  • References
  • 最後

資安宣言


撰寫本系列文章目的在於提升資訊安全之實務能力,
並透過實作體悟到資訊安全領域的重要性,
本系列所有文章之內容皆有一定技術水平,
不得從事非法行為、惡意攻擊等非法活動,
「一切不合法規之行為皆受法律所約束」,
為了避免造成公司、廠商或玩家之間困擾,
所有實作不會拿已上市產品、Online Game 等等來作範例學習,
且部分具有深度、價值之內容,將會提升一定閱讀門檻(不對該技術做分析、解說),
請勿透過本系列文章所學,從事任何非法活動,請不要以身試法!!!


測試環境與工具

技術原理與程式碼

首先開始前要先說一下,
小弟我目前還屬於菜鳥階段,正不斷努力學習中,
若有發現錯誤或不妥之處還請不吝賜教。
歡迎大家多多留言,互相交流交流。

那就開始今天的主題吧~~

大家知道在 kernel mode 也可以建立 Thread 來執行任務嗎?

今天就要來講講簡單跑在 kernel mode 的 thread。

首先使用 InitializeObjectAttributes 來初始化一個指向 OBJECT_ATTRIBUTES 的 Object,

VOID InitializeObjectAttributes(
  [out]          POBJECT_ATTRIBUTES   p,
  [in]           PUNICODE_STRING      n,
  [in]           ULONG                a,
  [in]           HANDLE               r,
  [in, optional] PSECURITY_DESCRIPTOR s
);
typedef struct _OBJECT_ATTRIBUTES {
  ULONG           Length;
  HANDLE          RootDirectory;
  PUNICODE_STRING ObjectName;
  ULONG           Attributes;
  PVOID           SecurityDescriptor;
  PVOID           SecurityQualityOfService;
} OBJECT_ATTRIBUTES;

建立自己的 Thread Func,然後我們使用 PsCreateSystemThread 建立一個 Kernel Thread:

NTSTATUS PsCreateSystemThread(
  PHANDLE            ThreadHandle,
  ULONG              DesiredAccess,
  POBJECT_ATTRIBUTES ObjectAttributes,
  HANDLE             ProcessHandle,
  PCLIENT_ID         ClientId,
  PKSTART_ROUTINE    StartRoutine,
  PVOID              StartContext
);

要記得 Sleep 一段時間,不然在 Kernel 中的 Thread 執行權很高,會占用大量 CPU 資源。

在這一個 Thread func 執行完後,要記得終止這個 Thread,不然會造成永久性傷害 XD

再來透過 Thread Handle 獲得 Thread Object ,
可以直接使用 ObReferenceObjectByHandle

NTSTATUS ObReferenceObjectByHandle(
  HANDLE                     Handle,
  ACCESS_MASK                DesiredAccess,
  POBJECT_TYPE               ObjectType,
  KPROCESSOR_MODE            AccessMode,
  PVOID                      *Object,
  POBJECT_HANDLE_INFORMATION HandleInformation
);

最後 Unload Driver 時,要記得把前面所述取得的 Object 做 ObDereferenceObject 的動作。

這樣就可以開心跑 Thread 啦~~

因小弟身體不適,後續文章的更新可能會稍微簡略,整體目錄(Day 16 ~ Day 29)將不會一次釋出,還請見諒...

若有斷文,小弟在此說聲抱歉,會在身體康復後寫完 QQ

好了,這篇就講到這結束了,
大家若有發現哪裡寫得不好或錯誤的地方,都留個言討論一下吧 XD
那我們下期見 o( ̄▽ ̄)ブ

References

最後

  • 如果你/妳喜歡我的文章,請記得訂閱按讚分享並且打開小鈴鐺哦
  • 這樣就能在第一時間收到通知,也不會錯過任何文章啦~~

上一篇
【Day 14】- 今天來實作一個鍵盤監聽器
系列文
打通任督二脈奇幻之旅 - 用 30 天探索 Windows 底層運作原理15
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言